package com.example.jedis.client.protocol.response;

import com.example.jedis.client.exception.RedisProtocolException;
import com.example.jedis.client.protocol.constant.RedisProtocolConstant;
import com.example.jedis.client.transport.RedisTransport;
import redis.clients.jedis.exceptions.JedisException;

import java.nio.ByteBuffer;

/**
 * redis 数据 回复：
 * 第一字节为 "$" 符号
 * 接下来跟着的是表示实际回复长度的数字值
 * 之后跟着一个 CRLF
 * 再后面跟着的是实际回复数据
 * 最末尾是另一个 CRLF
 * <p>
 * 示例：get key 返回值："$6\r\nfoobar\r\n"
 */
public class ApplyBulk extends AbstractApplyProtocol implements ApplyProtocol {


    @Override
    public byte getFlag() {
        return RedisProtocolConstant.APPLY_BULK;
    }


    @Override
    public String fromBytes(RedisTransport redisTransport, ByteBuffer byteBuffer) {
        int size = this.readFirstSegmentToInt(redisTransport, byteBuffer);
        if (size == -1) {//没有数据
            return null;
        } else if (size <= 0) {
            throw new RedisProtocolException("apply bulk:" + RedisProtocolConstant.APPLY_BULK + size + RedisProtocolConstant.CR_BYPE + RedisProtocolConstant.LF_BYTE);
        } else {
            String value = this.readFirstSegmentToString(redisTransport, byteBuffer, size);
            return value;
        }

    }


}

